# """迭代器"""

"""到目前为止， 你可能已经知道， 大多数容器可以使用for循环进行数据的遍历"""
for element in [1, 2, 3]:
    pass

"""这种访问方式清晰， 简洁， 方便。迭代器的使用遍布并统一了python.在后台，该for循环调用iter()容器对象。
    该函数返回一个迭代器的对象。该对象定义了__next__()一次访问一个容器中元素的方法。当没有更多的元素的时候， 
    __next__()引发一个StopIteration异常，告知for循环终止。您可以使用__next__()内置函数来调用该方法，
    这个列子展示如何工作
"""
# s = "abc"
# it = iter(s)
# print(it)
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
"""
了解迭代器协议背后的机制后， 可以很容易的将迭代器行为添加到类中，定义一个__iter__()方法，
该方法返回带有__next__()方法的对象，如果该类定义了__next__()，则__iter__()可以返回self"""
class Reverse:
    """Itetator for looping over a sequence backwards"""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index -1
        return self.data[self.index]


rev = Reverse("spam")
print(iter(rev)) # <__main__.Reverse object at 0x00000246A42CEA48>
# for char in rev:
#     print(char)
# m
# a
# p
# s

# 迭代器
"""generator是用于创建迭代器的简单而强大的工具。他们的编写方式与常规的函数类似，
但是yield只要要返回数据就使用该语句，每次next()调用它的时候，生成器都会从上次中断的地方继续
(他会记住所有数值以及最后执行的语句)， 一个实例显示生成器可以很容器的创建。"""


def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

for char in reverse("self"):
    print(char)
"""
    生成器可以完成的任何操作也可以使用上一级中所述的基于类的迭代器来完成。
使生成器如此紧揍的原因就是__iter__()and__next__()方法是自动创建的。

    另一个关键功能是局部变量和执行状态在两次调用之间自动保存。与使用示实例量(如self.index)的方法相比
"""

















